package Control;

import Clases.Asignardeduccion;
import Clases.Deduccion;
import Gestor.GestorDeduccion;
import java.sql.Date;
import java.util.ArrayList;

public class ControlDeduccion {

    private static ControlDeduccion instancia = null;
    private final GestorDeduccion gestorD = GestorDeduccion.obtenerInstancia();

    public static ControlDeduccion obtenerInstancia() {
        if (instancia == null) {
            instancia = new ControlDeduccion();
        }
        return instancia;
    }

    private ControlDeduccion() {
    }

    public int insertarDeduccion(Deduccion deduccionNueva) {
        return (Integer) gestorD.insertar(deduccionNueva);

    }

    public boolean modificarDeduccion(Deduccion deduccion) {
        return gestorD.actualizar(deduccion);
    }

    public boolean insertarOModificarDeduccion(Deduccion deduccion) {
        return gestorD.InsertarOActualizar(deduccion);
    }

    public boolean eliminarDeduccion(Deduccion deduccion) {
        return gestorD.eliminar(deduccion);
    }

    public ArrayList<ArrayList<Object>> eliminarVariasDeduccionesPorCodigo(ArrayList<Integer> codigoDeducciones) {
        ArrayList<Object> deduccionesNoEliminadas = new ArrayList<Object>();
        ArrayList<Object> asignacionesNoEliminadas = new ArrayList<Object>();
        for (int i = 0; i < codigoDeducciones.size(); i++) {
            Deduccion deduccion = this.getDeduccionPorCodigo(Integer.valueOf(codigoDeducciones.get(i)));
            ArrayList<Asignardeduccion> asignaciones = this.obtenerAsignacionesActualesPorDeduccion(codigoDeducciones.get(i));

            for (int j = 0; j < asignaciones.size(); j++) {

                if (!this.desasignarDeduccion(asignaciones.get(j))) {
                    asignacionesNoEliminadas.add(deduccion);
                }
            }
            ArrayList<Asignardeduccion> todasAsignaciones = this.obtenerAsignacionesPorDeduccion(codigoDeducciones.get(i));
            if (!todasAsignaciones.isEmpty()) {//quiere decir que hay asignaciones de esta deduccion en pagos historicos
                //por lo tanto se debe modificar para pasarla como inactiva
                deduccion.setActivo(false);
                if (!this.modificarDeduccion(deduccion)) {
                    deduccionesNoEliminadas.add(deduccion);
                }
            } else {
                if (!this.eliminarDeduccion(deduccion)) {//no hay asignaciones de esta deduccion en pagos
                    //historicos por lo que se puede eliminar por completo
                    deduccionesNoEliminadas.add(deduccion);
                }
            }
        }
        ArrayList<ArrayList<Object>> errores = new ArrayList<ArrayList<Object>>();
        errores.add(deduccionesNoEliminadas);
        errores.add(asignacionesNoEliminadas);

        return errores;
    }

    public ArrayList<Deduccion> obtenerListaDeducciones() {
        ArrayList< Deduccion> deducciones = gestorD.getListaDeducciones();
        return deducciones;
    }

    public Deduccion getDeduccionPorCodigo(int codigoDeduccion) {
        return gestorD.getDeduccionPorCodigo(codigoDeduccion);
    }

    public boolean asignarDeduccion(Asignardeduccion asignacion) {
        return gestorD.asignarDeduccion(asignacion);
    }

    public boolean desasignarDeduccion(Asignardeduccion asignacion) {
        return gestorD.eliminar(asignacion);
    }

    public ArrayList<Asignardeduccion> getAsignacionDeducciones(long numEmpleado) {
        return gestorD.getAsignacionDeducciones(numEmpleado);
    }

    public ArrayList<Asignardeduccion> getAsignacionDeducciones(Asignardeduccion asignacion) {
        return gestorD.getAsignacionDeduccion(asignacion);
    }

    public ArrayList<Asignardeduccion> obtenerAsignacionesActualesPorDeduccion(int codigoDeduccion) {
        return gestorD.getListaAsignacionesActualesPorDeduccion(codigoDeduccion);
    }

    public ArrayList<Asignardeduccion> obtenerAsignacionesPorDeduccion(int codigoDeduccion) {
        return gestorD.getListaAsignacionesPorDeduccion(codigoDeduccion);
    }

    public boolean modificarAsignacion(Asignardeduccion asignacion) {
        return gestorD.actualizar(asignacion);
    }

    public ArrayList<Deduccion> getAsignacionDeduccionesHistoricos(Long numEmpleado, Date fechaPagoInicio, Date fechaPagoFin) {
        return gestorD.getAsignacionDeduccionesHistoricos(numEmpleado, fechaPagoInicio, fechaPagoFin);
    }

    public boolean hayOtraAsignacion(Asignardeduccion asignacion) {
        return gestorD.hayOtraAsignacion(asignacion);
    }

    public boolean tieneAsignaciones(int codigoDeduccion) {
        return gestorD.cantidadAsignaciones(codigoDeduccion) > 0;
    }

}
